﻿using System.Collections.Generic;
using System.Linq;
using System.Transactions;
using Dogshow.Infrastructure.Exceptions;
using Dogshow.Model;
using DogshowRepository;

namespace Dogshow.BusinessLogic.Managers
{
    public class PasManager
    {
        private readonly IPsiRepository m_PsiRepository;

        private readonly IKorisniciRepository m_KorisniciRepository;

        public PasManager(IPsiRepository psiRepository, IKorisniciRepository korisniciRepository)
        {
            m_PsiRepository = psiRepository;
            m_KorisniciRepository = korisniciRepository;
        }

        public Pas VratiPsa(int id)
        {
            return m_PsiRepository.VratiPoId(id);
        }

        public IEnumerable<Pas> VratiOmiljenePseKorisnika(string korisnickoIme)
        {
            return m_PsiRepository.VratiOmiljenePseKorisnika(korisnickoIme);
        }

        public void SacuvajOmiljenogPsa(Pas pas, string korisnickoIme)
        {
            using (var ts = new TransactionScope())
            {
                m_PsiRepository.SacuvajPsaUOmiljene(pas, korisnickoIme); 
                ts.Complete();
            }
        }

        public IEnumerable<Pas> VratiSvePse()
        {
            return m_PsiRepository.VratiSve();
        }

        public void SacuvajPsa(Pas pas)
        {
            var pasSaRodovikom = m_PsiRepository.VratiPsaPoBrojuRodovnika(pas.BrojRodovnika);
            if (pasSaRodovikom != null && !pasSaRodovikom.IdVlasnika.HasValue)
            {
                throw new PasBezVlasnikaException();
            }
            if (pasSaRodovikom != null && pasSaRodovikom.Id != pas.Id)
            {
                throw new ValidationException("BrojRodovnika", "Postoji pas sa unetim brojem rodovnika");
            }
            if (pas.IdOca != null)
            {
                var otac = m_PsiRepository.VratiPoId(pas.IdOca.Value);
                if (otac.IdRase != pas.IdRase)
                {
                    throw new ValidationException("IdOca", "Rasa oca se ne poklapa se rasom psa");
                }
                if (pas.Ostenjen >= otac.Ostenjen)
                {
                    throw new ValidationException("Ostenjen", "Pas je stariji od oca");
                }
                if (otac.Pol != 1)
                {
                    throw new ValidationException("IdOca", "Pol oca nije odgovarajući");
                }
            }
            if (pas.IdMajke != null)
            {
                var majka = m_PsiRepository.VratiPoId(pas.IdMajke.Value);
                if (majka.IdRase != pas.IdRase)
                {
                    throw new ValidationException("IdMajke", "Rasa majke se ne poklapa se rasom psa");
                }
                if (pas.Ostenjen >= majka.Ostenjen)
                {
                    throw new ValidationException("Ostenjen", "Pas je stariji od majke");
                }
                if (majka.Pol != 2)
                {
                    throw new ValidationException("IdMajke", "Pol majke nije odgovarajući");
                }
            }
            if (pas.IdVlasnika.HasValue)
            {
                var korisnik = m_KorisniciRepository.VratiKorinsikaKinologa(pas.IdVlasnika.Value);
            }
            m_PsiRepository.Sacuvaj(pas);
        }

        public Pas VratiPsaPoBrojuRodovnika(string brojRodovnika)
        {
            return m_PsiRepository.VratiPsaPoBrojuRodovnika(brojRodovnika);
        }

        public IEnumerable<Pas> VratiPseKorisnika(string korisnickoIme)
        {
            var idKinologa = m_KorisniciRepository.VratiPoKorisnickomImenu(korisnickoIme).IdKinologa;
            if (!idKinologa.HasValue) return Enumerable.Empty<Pas>();
            return m_PsiRepository.VratiPseKinologa(idKinologa.Value);
        }
    }
}